dbtでモデルのconfigに設定された値を別のスクリプトから参照する方法
データアナリティクス事業本部のueharaです。
今回は、dbtでモデルのconfigに設定された値を別のスクリプトから参照する方法をご紹介してみたいと思います。
はじめに
dbt run
実行時であれば、そのモデルに設定されたconfigの値は以下のようにconfig.get()
を用いることで取得することができます。
{% set config_full_refresh = config.get('full_refresh') %}
ただし、他のモデルのdbt run
実行時に別モデルのconfigを参照したい場合や、同じモデルであってもdbt test
実行時はそもそもconfig変数に情報が読み込まれないため、仮に参照をしたい場合は別口を用意する必要があります。
実現方法
結論から言うと、graph context変数を使うことで実現できます。
graph context変数はdbtの.sqlファイル内であればどこでも利用できる変数で、マニフェストとほぼ同様の構造をしている情報が格納されています。
以下はモデルのスキーマ名とテーブル名を渡すと、graph context変数から一致するconfigの情報を取得するマクロになります。
{% macro get_config_values(model_schema, model_table) %} {% set ns = namespace(config=none) %} {% if execute %} {% for node in graph.nodes.values() %} {%- if node.schema == model_schema and (node.name == model_table or node.alias == model_table) -%} {% set ns.config = node.config %} {%- endif -%} {% endfor %} {% endif %} {{ return(ns.config) }} {% endmacro %}
上記を用意すれば、例えばtestを行うスクリプト内でも、以下のように参照できます。
{% test test_xxx(model) %} {%- set config = get_config_values(model.schema, model.identifier) -%} {{ log("config_full_refresh : " ~ config.full_refresh) }} ... {% endtest %}
一点注意点として、graph context変数はparse phaseで書き換えられるため、execute phaseで参照する必要がある点になります。
なお、dbtの動作モードについては以下の記事が参考になるかと思います。
最後に
今回は、dbtでモデルのconfigに設定された値を別のスクリプトから参照する方法を紹介してみました。
参考になりましたら幸いです。